package com.c2b.algorithm.leetcode.base;

import java.util.Arrays;

/**
 * <a href='https://leetcode.cn/problems/largest-substring-between-two-equal-characters/'>两个相同字符之间的最长子字符串(Largest Substring Between Two Equal Characters)</a>
 * <p>给你一个字符串 s，请你返回 两个相同字符之间的最长子字符串的长度 ，计算长度时不含这两个字符。如果不存在这样的子字符串，返回 -1 。</p>
 * <p>子字符串 是字符串中的一个连续字符序列。</p>
 *
 * <p>
 * <b>示例：</b>
 * <pre>
 * 示例 1：
 *      输入：s = "aa"
 *      输出：0
 *      解释：最优的子字符串是两个 'a' 之间的空子字符串。
 *
 * 示例 2：
 *      输入：s = "abca"
 *      输出：2
 *      解释：最优的子字符串是 "bc" 。
 *
 * 示例 3：
 *      输入：s = "cbzxy"
 *      输出：-1
 *      解释：s 中不存在出现出现两次的字符，所以返回 -1 。
 *
 * 示例 4：
 *      输入：s = "cabbac"
 *      输出：4
 *      解释：最优的子字符串是 "abba" ，其他的非最优解包括 "bb" 和 "" 。
 * </pre>
 * </p>
 *
 * <p>
 * <b>提示：</b>
 *     <ul>
 *         <li>1 <= s.length <= 300</li>
 *         <li>s 只含小写英文字母</li>
 *     </ul>
 * </p>
 *
 * @author c2b
 * @since 2023/12/20 14:54
 */
public class LC1624LargestSubstringBetweenTwoEqualCharacters_S {
    static class Solution {
        public int maxLengthBetweenEqualCharacters(String s) {
            // 用于记录每个字符第一次出现的位置
            int[] cnt = new int[26];
            Arrays.fill(cnt, -1);
            char[] chars = s.toCharArray();
            int ans = -1;
            for (int i = 0; i < chars.length; i++) {
                if (cnt[chars[i] - 'a'] == -1) {
                    cnt[chars[i] - 'a'] = i;
                } else {
                    ans = Math.max(ans, i - cnt[chars[i] - 'a'] - 1);
                }
            }
            return ans;


            // 用于统计每个字符第一次和最后一次出现的位置
            //int[][] cnt = new int[26][2];
            //for (int[] ints : cnt) {
            //    ints[0] = -1;
            //    ints[1] = -1;
            //}
            //char[] chars = s.toCharArray();
            //for (int i = 0; i < chars.length; i++) {
            //    if (cnt[chars[i] - 'a'][0] == -1) {
            //        cnt[chars[i] - 'a'][0] = i;
            //    } else {
            //        cnt[chars[i] - 'a'][1] = i;
            //    }
            //}
            //int ans = -1;
            //for (int[] ints : cnt) {
            //    if (ints[1] != -1) {
            //        ans = Math.max(ans, ints[1] - ints[0]-1);
            //    }
            //}
            //return ans;
        }
    }
}
